package com.wen.Part6.DataStructure;

import com.wen.Part6.GraphAlgorithm.GraphAlgorithm;

import java.io.*;
import java.util.List;

// 图顶点
// Adjacency list  邻接表
// Adjacency matrix  邻接矩阵
public interface Graph {

    // 获取入度
    int getInDegree(int i);

    // 获取出度
    int getOutDegree(int i);

    // 获取顶点数
    int getSize();

    // 获得权值
    int getWeight(int i, int j);

    // 增加i到j的边
    void add(int i, int j);

    // 增加i到j的边，和权值
    void add(int i, int j, int weigth);

    // 获取i可以到达的点
    List<Integer> getAccessible(int i);

    // 获取可以到达i的点
    List<Integer> getAccessibled(int i);

    int getEdgeSize();

    List<Edge> getEdges();

    // key转换为索引
    int key2Index(String key);

    // 索引转换为key
    String index2Key(int index);

    // 调用算法
    default Object solve(GraphAlgorithm ga){
        return ga.solve(this);
    }


// 获取入度数组
    default int[] getInDegreeArray(){
        int[] inDegree = new int[this.getSize()];

        for (int i = 0; i < getSize(); i++) {
            inDegree[i] = getInDegree(i);
        }
        return inDegree;
    }

// 获取出度数组
    default int[] getOutDegreeArray(){
        int[] outDegree = new int[this.getSize()];
        for (int i = 0; i < getSize(); i++) {
            outDegree[i] = getOutDegree(i);
        }
        return outDegree;
    }


// 通过外部文件初始化邻接矩阵
    default void init(File file){
        BufferedReader bufferedReader = null;
        try {
            bufferedReader = new BufferedReader(new FileReader(file));
            String line = null;
            while ((line = bufferedReader.readLine()) != null && line.length() != 0){
                if (line.startsWith("#")) continue;
                // 通过空白分割
                String[] s = line.split("\\s");
                // 如果分割长度是2，表示是无权图

                if(s.length == 2){
                    this.add(key2Index(s[0]), key2Index(s[1]));
                }else{
                    // 长度是3，第3个是权值
                    this.add(key2Index(s[0]), key2Index(s[1]),Integer.parseInt(s[2]));
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            System.err.println("读取文件出现异常");
        }finally {
            try {
                bufferedReader.close();
            } catch (IOException e) {
                System.err.println("关闭文件出现异常");
            }
        }
    }
}